/**
 * as const 断言类似于一个大杀器，非常的常用，也非常的好用
 */

/**
 * 这样写的效果就类似于 let string:'Jimmy' = 'Jimmy'
 *  string的值只能是 Jimmy 不能是其他的
 *
 * 本来 string是用let定义的宽泛类型  as const之后编程了值类型
 *  */
let string = 'Jimmy' as const
string = 'Jimmy'
/**
 * 与 const 定义的区别是： 使用 let 加 as const转成的值类型是可以再赋值的
 *  而使用 const 定义的常量值类型是不能够进行二次赋值
 */
const str1 = 'Jimmy'
// str1 = 'Jimmy'

/**
 * 数组使用 as const 修饰之后 这个数组会被转成 有严格限制的元组！
 *  如这里的arr就变成了只读一个元组  它的第一项一定是 Jimmy 第二项一定是22
 * let arr: readonly ["Jimmy", 22]
 */
let arr = ['Jimmy', 22] as const

/**
 * 
 * let obj: {
    readonly name: "Jimmy";
    readonly age: 22;
  }
  obj这个对象加上 as const 之后 也变成了值类似的对象了 name属性值只能是Jimmy age属性值只能是 22
 */
let obj = {
	name: 'Jimmy',
	age: 22,
} as const
// 想改是改不了的 一方面是因为它本身是只读属性 另外一方面它只能是22不能改成33
// obj.age = 33
